package dk.itu.KrakMap;

import java.util.*;

/**
 *
 * @author ITU-KF04-2011, Group 11
 */
public enum ZoomFilter {

    ZOOM1(
    new HashSet<RoadType>(){{
            add(RoadType.Andenvej);
            add(RoadType.Andenvejafkorsel);
            add(RoadType.Andenvejtunnel);
            add(RoadType.Mindrevejtunnel);
            add(RoadType.Motortrafikvejsafkorsel);
            add(RoadType.Motorvejsafkorsel);
            add(RoadType.Motortrafikvej);
            add(RoadType.Motorvejstunnel);
            add(RoadType.Primaervejsafkorsel);
            add(RoadType.Primaervejstunnel);
            add(RoadType.Projandenvej);
            add(RoadType.Projsti);
            add(RoadType.Projvej);
            add(RoadType.Sekundaervejsafkorsel);
            add(RoadType.Sekundaervejstunnel);
            add(RoadType.Stednavn);
            add(RoadType.Sti);
            add(RoadType.Stitunnel);
            add(RoadType.Vej);
            add(RoadType.gaagader);
            add(RoadType.markvej);
            add(RoadType.projprimaervej);
            add(RoadType.projsekundaervej);
            add(RoadType.Sekundaerrute);
        }},20000,0.0
    ),
    ZOOM2(
        new HashSet<RoadType>(){{
            add(RoadType.Andenvej);
            add(RoadType.Andenvejafkorsel);
            add(RoadType.Andenvejtunnel);
            add(RoadType.Mindrevejtunnel);
            add(RoadType.Projandenvej);
            add(RoadType.Projsti);
            add(RoadType.Projvej);
            add(RoadType.Sekundaervejsafkorsel);
            add(RoadType.Stednavn);
            add(RoadType.Sti);
            add(RoadType.Stitunnel);
            add(RoadType.gaagader);
            add(RoadType.markvej);
        }},5000,0.015
    ),
    ZOOM3(
        new HashSet<RoadType>(){{
            add(RoadType.Projsti);;
            add(RoadType.Stednavn);
            add(RoadType.Sti);
            add(RoadType.Stitunnel);
            add(RoadType.markvej);
        }},5000,0.07
    ),
    ZOOM4(
        new HashSet<RoadType>(){{
        }},0,0.13
    );
    private final HashSet<RoadType> excluded;
    private final int simplifyLevel;
    private final double minPixelsPerMeter;
    private static ZoomFilter mostOpen;
    private static ZoomFilter leastOpen;

    static {
        for(ZoomFilter f : ZoomFilter.values()){
            if(mostOpen == null) mostOpen = f;
            if(leastOpen == null) leastOpen = f;
            if(f.getMinPixelPerMeter() > mostOpen.getMinPixelPerMeter()) mostOpen = f;
            if(f.getMinPixelPerMeter() < leastOpen.getMinPixelPerMeter()) leastOpen = f;
        }
    }

    ZoomFilter(HashSet<RoadType> excluded, int simplifyLevel, double minPixelsPerMeter) {
        this.excluded = excluded;
        this.simplifyLevel = simplifyLevel;
        this.minPixelsPerMeter = minPixelsPerMeter;
    }

    public boolean isExcluded(RoadType type) {
        return excluded.contains(type);
    }

    public int getSimplifyLevel() {
        return simplifyLevel;
    }

    public double getMinPixelPerMeter() {
        return minPixelsPerMeter;
    }

    public static ZoomFilter getMostOpenFilter() {
        return mostOpen;
    }

    public static ZoomFilter getLeastOpenFilter() {
        return leastOpen;
    }

    public static ZoomFilter getFromPixelsPerMeter(double pixelsPerMeter) {
        ZoomFilter last = getLeastOpenFilter();
        for (ZoomFilter f : ZoomFilter.values()) {
            if (pixelsPerMeter > f.minPixelsPerMeter) {
                last = f;
            } else {
                break;
            }
        }
        return last;
    }
}
